home *** CD-ROM | disk | FTP | other *** search
/ Ian & Stuart's Australian Mac: Not for Sale / Another.not.for.sale (Australia).iso / hold me in your arms / PGP 2.6 / rsaref Toolkit / source / nn.h < prev    next >
Text File  |  1992-02-29  |  4KB  |  103 lines

  1. /* NN.H - header file for NN.C
  2.  */
  3.  
  4. /* Copyright (C) 1991-2 RSA Laboratories, a division of RSA Data
  5.    Security, Inc. All rights reserved.
  6.  */
  7.  
  8. /* Type definitions.
  9.  */
  10. typedef UINT4 NN_DIGIT;
  11. typedef UINT2 NN_HALF_DIGIT;
  12.  
  13. /* Constants.
  14.  
  15.    Note: MAX_NN_DIGITS is long enough to hold any RSA modulus, plus
  16.    one more digit as required by R_GeneratePEMKeys (for n and phiN,
  17.    whose lengths must be even). All natural numbers have at most
  18.    MAX_NN_DIGITS digits, except for double-length intermediate values
  19.    in NN_Mult (t), NN_ModMult (t), NN_ModInv (w), and NN_Div (c).
  20.  */
  21. /* Length of digit in bits */
  22. #define NN_DIGIT_BITS 32
  23. #define NN_HALF_DIGIT_BITS 16
  24. /* Length of digit in bytes */
  25. #define NN_DIGIT_LEN (NN_DIGIT_BITS / 8)
  26. /* Maximum length in digits */
  27. #define MAX_NN_DIGITS \
  28.   ((MAX_RSA_MODULUS_LEN + NN_DIGIT_LEN - 1) / NN_DIGIT_LEN + 1)
  29. /* Maximum digits */
  30. #define MAX_NN_DIGIT 0xffffffff
  31. #define MAX_NN_HALF_DIGIT 0xffff
  32.  
  33. /* Macros.
  34.  */
  35. #define LOW_HALF(x) (NN_HALF_DIGIT)((x) & MAX_NN_HALF_DIGIT)
  36. #define HIGH_HALF(x) \
  37.   (NN_HALF_DIGIT)(((x) >> NN_HALF_DIGIT_BITS) & MAX_NN_HALF_DIGIT)
  38. #define TO_HIGH_HALF(x) (((NN_DIGIT)(x)) << NN_HALF_DIGIT_BITS)
  39. #define DIGIT_MSB(x) (unsigned int)(((x) >> (NN_DIGIT_BITS - 1)) & 1)
  40. #define DIGIT_2MSB(x) (unsigned int)(((x) >> (NN_DIGIT_BITS - 2)) & 3)
  41.  
  42. /* CONVERSIONS
  43.    NN_Decode (a, digits, b, len)   Decodes character string b into a.
  44.    NN_Encode (a, len, b, digits)   Encodes a into character string b.
  45.  
  46.    ASSIGNMENTS
  47.    NN_Assign (a, b, digits)        Assigns a = b.
  48.    NN_ASSIGN_DIGIT (a, b, digits)  Assigns a = b, where b is a digit.
  49.    NN_AssignZero (a, b, digits)    Assigns a = 0.
  50.    NN_Assign2Exp (a, b, digits)    Assigns a = 2^b.
  51.      
  52.    ARITHMETIC OPERATIONS
  53.    NN_Add (a, b, c, digits)        Computes a = b + c.
  54.    NN_Sub (a, b, c, digits)        Computes a = b - c.
  55.    NN_Mult (a, b, c, digits)       Computes a = b * c.
  56.    NN_Mod (a, b, bDigits, c, cDigits)  Computes a = b mod c.
  57.    NN_ModMult (a, b, c, d, digits) Computes a = b * c mod d.
  58.    NN_ModExp (a, b, c, cDigits, d, dDigits)  Computes a = b^c mod .
  59.    NN_ModInv (a, b, c, digits)     Computes a = 1/b mod c.
  60.    NN_Gcd (a, b, c, digits)        Computes a = gcd (b, c).
  61.  
  62.    OTHER OPERATIONS
  63.    NN_EVEN (a, digits)             Returns 1 iff a is even.
  64.    NN_Cmp (a, b, digits)           Returns sign of a - b.
  65.    NN_EQUAL (a, digits)            Returns 1 iff a = b.
  66.    NN_Zero (a, digits)             Returns 1 iff a = 0.
  67.    NN_Digits (a, digits)           Returns significant length of a in digits.
  68.    NN_Bits (a, digits)             Returns significant length of a in bits.
  69.  */
  70. void NN_Decode PROTO_LIST
  71.   ((NN_DIGIT *, unsigned int, unsigned char *, unsigned int));
  72. void NN_Encode PROTO_LIST
  73.   ((unsigned char *, unsigned int, NN_DIGIT *, unsigned int));
  74.  
  75. void NN_Assign PROTO_LIST ((NN_DIGIT *, NN_DIGIT *, unsigned int));
  76. void NN_AssignZero PROTO_LIST ((NN_DIGIT *, unsigned int));
  77. void NN_Assign2Exp PROTO_LIST ((NN_DIGIT *, unsigned int, unsigned int));
  78.  
  79. NN_DIGIT NN_Add PROTO_LIST
  80.   ((NN_DIGIT *, NN_DIGIT *, NN_DIGIT *, unsigned int));
  81. NN_DIGIT NN_Sub PROTO_LIST
  82.   ((NN_DIGIT *, NN_DIGIT *, NN_DIGIT *, unsigned int));
  83. void NN_Mult PROTO_LIST ((NN_DIGIT *, NN_DIGIT *, NN_DIGIT *, unsigned int));
  84. void NN_Mod PROTO_LIST
  85.   ((NN_DIGIT *, NN_DIGIT *, unsigned int, NN_DIGIT *, unsigned int));
  86. void NN_ModMult PROTO_LIST 
  87.   ((NN_DIGIT *, NN_DIGIT *, NN_DIGIT *, NN_DIGIT *, unsigned int));
  88. void NN_ModExp PROTO_LIST 
  89.   ((NN_DIGIT *, NN_DIGIT *, NN_DIGIT *, unsigned int, NN_DIGIT *,
  90.     unsigned int));
  91. void NN_ModInv PROTO_LIST
  92.   ((NN_DIGIT *, NN_DIGIT *, NN_DIGIT *, unsigned int));
  93. void NN_Gcd PROTO_LIST ((NN_DIGIT *, NN_DIGIT *, NN_DIGIT *, unsigned int));
  94.  
  95. int NN_Cmp PROTO_LIST ((NN_DIGIT *, NN_DIGIT *, unsigned int));
  96. int NN_Zero PROTO_LIST ((NN_DIGIT *, unsigned int));
  97. unsigned int NN_Bits PROTO_LIST ((NN_DIGIT *, unsigned int));
  98. unsigned int NN_Digits PROTO_LIST ((NN_DIGIT *, unsigned int));
  99.  
  100. #define NN_ASSIGN_DIGIT(a, b, digits) {NN_AssignZero (a, digits); a[0] = b;}
  101. #define NN_EQUAL(a, b, digits) (! NN_Cmp (a, b, digits))
  102. #define NN_EVEN(a, digits) (((digits) == 0) || ! (a[0] & 1))
  103.